Lab 4 - Zastosowanie ROS’a w robotyce

Modelowanie i sterowanie robotów - laboratorium

Lab 4 - Zastosowanie ROS’a w robotyce

Politechnika Poznańska

Instytut Robotyki i Inteligencji Maszynowej

Logo PP

Jakub Chudziński, Bartłomiej Kulecki


Instalacja potrzebnego oprogramowania

Na zajęciach będziemy pracować z ROS Noetic Ninjemys (bazującym na Ubuntu 20.04). Rekomendowane jest skorzystanie z dostarczonego i skonfigurowanego oprogramowania tworzącego tzw. kontener. Instalacja jest opisana zarówno dla użytkowników Windowsa jak i Ubuntu. Na komputerach w laboratorium można pominąć proces instalacji i przejść do sekcji “Uruchomienie ROS’a”.

Windows Logo win

  1.   Pobierz XLaunch Server ze strony https://sourceforge.net/projects/vcxsrv/ i zainstaluj.
  2.   Pobierz Docker Desktop ze strony https://docs.docker.com/desktop/install/windows-install/ i zainstaluj.
  3.   Pobierz Visual Studio Code ze strony https://code.visualstudio.com/download i zainstaluj.
  4.   Otwórz VS Code i zainstaluj rozszerzenie (skrót CTRL+SHIFT+X) o nazwie “Remote Development”.
  5.   Pobierz repozytorium:
  1.   w przeglądarce:
          wciśnij przycisk Code --> Download ZIP, rozpakuj w wybranej lokalizacji na dysku,
  2.   lub w wierszu polecenia:
          użyj komendy:   git clone https://github.com/Jakubach/pilz_ros_docker.git

Ubuntu Logo ubuntu

  1.   Pobierz Docker Engine, instrukcja: https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
  2.   Opcjonalnie, możesz wykonać kroki poinstalacyjne dla Docker Engine przedstawione na stronie:
      https://docs.docker.com/engine/install/linux-postinstall/
  3.   Pobierz i zainstaluj Visual Studio Code poleceniem w Terminalu:   sudo apt-get install code
  4.   Otwórz VS Code i zainstaluj rozszerzenie (skrót CTRL+SHIFT+X) o nazwie “Remote Development”
  5.   Pobierz repozytorium:
  1.   w przeglądarce:
          zmień branch na Ubuntu, wciśnij przycisk Code --> Download ZIP, rozpakuj w wybranej lokalizacji na dysku,
  2.   lub w Terminalu:
          użyj komendy:   git clone https://github.com/Jakubach/pilz_ros_docker.git -b Ubuntu

Dla chętnych: instalacja bez Dockera

Instalacja bez Dockera na systemie Ubuntu 20.04

Oprócz rekomendowanej instalacji oprogramowania z wykorzystaniem Dockera, można również zastosować podejście, w którym instaluje się system operacyjny Ubuntu równolegle (obok) systemu Windows. Wówczas przy uruchamianiu komputera pojawia się możliwość wyboru systemu, który chcemy włączyć.
UWAGA! Zachowaj szczególną ostrożność przy instalacji Ubuntu na dysku twardym, zapoznaj się dokładnie z dostępnymi w sieci instrukcjami instalacji, tak aby nie usunąć przez przypadek Windowsa, jeśli tego nie chcesz.

Poniżej znajduje się instrukcja instalacji. Dotyczy ona instalacji dla systemu Ubuntu w wersji 20.04. Jeśli masz już na swoim komputerze system operacyjny Ubuntu 20.04 LTS: - zainstaluj ROS Noetic (w wersji full) - utwórz workspace:

source /opt/ros/noetic/setup.bash
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
cd ~/catkin_ws/
git clone https://github.com/Jakubach/pilz_ros_docker.git -b Ubuntu .
bash src/pilz_tutorial/install.sh
catkin_make
Po wykonaniu tych operacji możesz korzystać z paczki pilz_tutorial, która jest potrzebna w zadaniach z instrukcji do zajęć 5 i 6.

Uruchomienie ROS’a

Windows Logo win

  1.   Uruchom XLaunch Server z domyślnymi ustawieniami.
  2.   Uruchom Docker Desktop (pozostawiając w tle).
  3.   Uruchom VS Code i otwórz folder pilz_ros_docker/src, jak pokazano na obrazku (aby powiększyć grafikę, otwórz ją w nowej karcie przeglądarki).
Alt text

Przy pierwszym uruchomieniu należy poczekać nieco dłużej na pobranie i instalację potrzebnego oprogramowania.

Ubuntu (lab) Logo ubuntu

  1.   Otwórz Terminal i uruchom Docker Engine poleceniem sudo systemctl start docker (może nie być konieczne).
  2.   Uruchom VS Code i otwórz folder pilz_ros_docker/src, jak pokazano na obrazku (aby powiększyć grafikę, otwórz ją w nowej karcie przeglądarki).
Alt text

Przy pierwszym uruchomieniu należy poczekać nieco dłużej na pobranie i instalację potrzebnego oprogramowania.


Wprowadzenie do ROS’a

Robot Operating System (ROS) jest oprogramowaniem open-source umożliwiającym tworzenie aplikacji dla robotów i systemów zrobotyzowanych. Środowisko między innymi dostarcza narzędzia do obsługi urządzeń zewnętrznych (np. sterowniki do kamer, czujników), do modelowania oraz sterowania robotów i ich otoczenia oraz udostępnia interfejs do komunikacji między procesami. ROS cechuje się rozproszoną (modułową) architekturą bazującą na SOA (ang. Service-Oriented Architecture), czyli taką, w której system realizuje niezależne zadania, które mogą być łączone w większe procesy. Celem korzystania z ROS’a jest tworzenie modułów, które mogą zostać przeniesione i wykorzystane w różnych aplikacjach robotycznych. ### Programowanie w ROS’ie odbywa się najczęściej z wykorzystaniem języków C++ lub Python. Wybór języka programowania zdeterminowany jest przeznaczeniem aplikacji, a także rozplanowaniem rozwiązania. Aplikacje, które mają działać w czasie rzeczywistym, czyli przykładowo moduł do sterowania robotem, najczęściej spotyka się napisane w C++. Python jako język trochę wyższego poziomu pozwala na uzyskanie szybszego efektu (prototypu), ale też jest częściej wykorzystywany w przypadku przetwarzania obrazów, co ma zawsze miejsce kiedy robot współpracuje z kamerą. Przy planowaniu rozwiązania opartego o ROS’a warto przejrzeć gotowe moduły udostępnione przez społeczność. ### Programowanie w ROS’ie wymaga znajomości Linuxa (i języka angielskiego). Gdyby zapytać przypadkowo spotkaną osobę o ROS’a pod Windowsem, na jej twarzy pojawiłby się niepewny wyraz, a w głowie pytanie “po co?”. Wiąże się to z założeniem, że osoba tworząca w ROS’ie, raczej nie będzie miała problemu z zapoznaniem się z systemem Linuxowym. Nie bez powodu, żadna dystrubucja ROS’a przez długi czas (do 2018 roku) nie była dostępna pod Windowsem. Ubuntu, czy inne dystrybucje Linuxa są bardziej “customowymi” systemami, tzn. udostępniają użytkownikom bardziej zaawansowany dostęp do narzędzi i konfiguracji systemowych. Dla większości użytkowników, pierwszym systemem pod aplikacje związane z tworzeniem systemów robotycznych są Linuxowe dystrybucje. Warto korzystać z czegoś, co posiada dużą społeczność, ponieważ większość problemów, na które napotkamy, została już rozwiązana. Do tego zalecany jest również język angielski jako systemowy. ### Programowanie w ROS’ie to również praca ze sprzętem i dokumentacją. Dobre, zaawansowane oprogramowanie w ROS’ie, na przykład sterownik dla robota, posiada wersję symulacyjną oraz działającą na realnym sprzęcie. Jest to wykorzystanie potencjału ROS’a w kwestii przenośności oprogramowania. Podejście to pozwala na szybkie testowanie i rozwój oprogramowania, a także na weryfikację parametrów (np. dokładności pozycjonowania) na realnym sprzęcie. Użytkownik ROS’a oprócz wygenerowania obrazu z kamery w środowisku symulacyjnym, powinien również być w stanie uruchomić fizyczną kamerę połączoną z komputerem. W większości przypadków, oprogramowanie do obsługi urządzeń jest już udostępnione wraz z informacją o interfejsowaniu. ### Wreszcie, programowanie w ROS’ie to przyjemność. Utworzenie własnego robota, którym można sterować i nic nie stoi na przeszkodzie, aby w prosty sposób rozwijać o nowe sensory - taka obserwacja efektów i dostrzeganie nowych możliwości są dużą motywacją w pracy. ROS jest środowiskiem intuicyjnym i pozwala na realizowanie pomysłów zarówno początującym jak i bardziej zaawansowanym użytkownikom. Słabymi punktami, które zostały poprawione w wersji ROS2, jest system bezpieczeństwa oraz trud we współpracy z niektórymi systemami rzeczywistymi, pomimo to ROS jest wykorzystywany w przemyśle (ROS Industrial).

Struktura funkcjonalna ROS’a

Robot Operating System jest zainstalowany w systemie (natywnie lub wewnątrz kontenera) pod ścieżką /opt/ros/noetic lub w przypadku innych dystrybucji ROS’a: /opt/ros/<ROS-DISTRO>.
Otwierając nowy terminal należy zawsze przed rozpoczęciem pracy wykonać komendę:
source /opt/ros/noetic/setup.bash
Komenda ta wskazuje potomnym procesom, gdzie jest zainstalowany ROS, ustawia wymagane zmienne środowiskowe - po prostu umożliwia korzystanie z ROS’a.

ROS Master

Jest to serwer, który umożliwia komunikację pomiędzy procesami (węzłami).

Jest pierwszą rzeczą, którą uruchamiamy korzystając z ROS’a. Wykonaj to poleceniem:

roscore

Węzeł (ang. node)

Proces pełniący określone zadanie. W obrębie modułu może być utworzone wiele współpracujących węzłów.

Polecenie roscore zablokowało okno terminala, dlatego otwórz nowe okno (CTRL+SHIFT+`). Wyświetl listę aktywnych węzłów poleceniem:

rosnode list

W efekcie powinien zostać wyświetlony pojedyczny węzeł rosout, który został utworzony automatycznie. Gromadzi on logi ze wszystkich węzłów.

Jeśli w terminalu jest uruchomiony proces, który blokuje to okno i chcemy go zakończyć, należy użyć skrótu CTRL+C

Moduł (ang. module, package)

Moduł to zbiór procesów realizujących określone zadanie. Na moduł może składać się jeden lub więcej węzłów. Przykładowym modułem może być aplikacja do przetwarzania danych biomedycznych, w której jeden z węzłów odpowiada za odbiór danych z różnych czujników, a drugi za przetwarzanie ich na komendy sterujące robotem.

Aby uruchomić pojedyczny węzeł z danego modułu wykorzystujemy komendę:

rosrun [package_name] [node_name]

Wykonaj poniższe polecenie, aby uruchomić przykładowy, domyślnie zainstalowany węzeł:

rosrun turtlesim turtlesim_node

Wyświetl ponownie listę aktywnych węzłów.

Temat (ang. topic)

Węzły mogą się komunikować za pomocą tematów. Jeden z węzłów jest nazywany publikującym (ang. publisher lub advertiser), a drugi subskrybującym (ang. subscriber). Węzeł publikujący przesyła wiadomości na danym temacie i mogą być one odbierane przez wielu subskrybentów.

Jeśli węzeł turtlesim_node jest wyłączony, uruchom go. W nowym oknie terminala uruchom kolejny węzeł poleceniem:

rosrun turtlesim turtle_teleop_key

Ten węzeł dodaje możliwość sterowania symulowanym żółwiem za pomocą strzałek klawiatury. Aby sterować żółwiem, kliknij najpierw na okno terminala z tym węzłem.

W nowym oknie terminala wyświetl listę dostępnych tematów poleceniem:

rostopic list

Wyświetl dane publikowane na temacie /turtle1/cmd_vel poniższym poleceniem. Poruszaj żółwiem i zaobserwuj publikowane dane.

rostopic echo /turtle1/cmd_vel

Wiadomość (ang. message)

Węzły przekazują pomiędzy sobą wiadomości, mogą to być np. przetworzone dane z czujnika.

Wyświetl typ danych publikowanych na temacie /turtle1/cmd_vel.

rostopic type /turtle1/cmd_vel

W efekcie wyświetlone zostanie: geometry_msgs/Twist. Aby wyświetlić informację o typie tej wiadomości, wykonaj polecenie:

rosmsg show geometry_msgs/Twist

Zazwyczaj wiadomości publikujemy wewnątrz zaprogramowanego węzła, ale istnieje również możliwość publikowania wiadomości z poziomu okna terminala:

rostopic pub [topic] [msg_type] [args]

Wykonaj poniższe polecenie, aby wysterować symulowanego źółwia:

rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

Możesz jednocześnie publikować dane z wielu okien lub wielu węzłów. Spróbuj publikować powyższą komendę i jednocześnie sterować źółwiem za pomocą klawiatury.

Bibliotekami, które implementują powyższą funkcjonalność są rospy dla Pythona oraz roscpp dla C++, umożliwiają one np. tworzenie węzłów, czy dodawanie subskrybentów/publikujących.

Przykłady projektów w ROS’ie

Poniżej przedstawiono przykładowe projekty, aby odpowiedzieć na pytanie “co można w tym ROS’ie zrobić?”, niekoniecznie od 0, ale z wykorzystaniem istniejących narzędzi.

Sterowanie manipulatorami Pilz - Pilz_robots

Wymieniony w tytule projekt posiada wiele modułów (paczek). Jego celem jest umożliwienie planowania zadań dla manipulatorów kooperacyjnych Pilz.

Moduł Przeznaczenie
prbt_support Dostarczenie opisu kinematyki robota PRBT 6, limitów obrotów osi i wizualizacji.
prbt_moveit_config Integracja robota z modułem do planowania ruchu MoveIt.
prbt_pg70_support Integracja chwytaka pg70 z robotem.
pilz_trajectory_generation Dostarczenie planerowi ruchu MoveIt komend technologicznych PTP, Lin, Circ.
pilz_robot_programming Dostarczenie użytkownikowi API w Pythonie do programowania robota.

users

Sterowanie manipulatorami Universal Robots - Universal_Robots_ROS_Driver

Celem paczki jest umożliwienie planowania zadań dla manipulatorów kooperacyjnych Universal Robots. Poniżej przedstawiono moduły składające się na projekt.

Moduł Przeznaczenie
universal_robot Dostarczenie opisu kinematyki robotów Universal Robots, limitów obrotów osi i wizualizacji.
ur_robot_driver Integracja robota z modułem do planowania ruchu MoveIt.
ur_controllers Rozszerzenie interfejsu sterowania o informacje dedykowane dla UR.
ur_calibration Dostarczenie (poprawa) opisu kinematyki na podstawie kalibracji robota.
controller_stopper Zapewnienie ciągłości działania sterownika ROS’owego w razie wystąpienia błędu na sterowniku robota (np. zatrzymanie z powodu przekroczenia dopuszczalnej siły).

Narzędzie do nauki ROS’a - turtlesim

Celem paczki jest stworzenie środowiska do zapoznania się z ROS’em. Poniżej przestawiono kreatywne projekty utworzone na jej bazie.
Turtle Pong - żółwi ping-pong
users

Turtle Sketch - żółwi da Vinci
users

Turtle Snake - żółwi snake
users

Turtle Planner - żółwi unikacz zderzeń
users

Więcej projektów dla początkujących dostępne na stronie roboacademy.

💥 🔥 Zadania do wykonania: 💥 🔥

Zadanie 1.
Uruchom terminal i przejdź do katalogu catkin_ws, zapoznaj się z jego strukturą. Jest to Twoje środowisko pracy z ROS’em. Wyświetl jego zawartość korzystając z odpowiedniej komendy, następnie przejdź do folderu src i ponownie wyświetl zawartość tego katalogu. Jak nazywają się paczki zainstalowane w Twoim środowisku? Uwaga, wpisując nazwę docelowego folderu warto wykorzystywać auto-uzupełnianie nazw po wciśnięciu klawisza TAB.

Zadanie 2.
Przejdź do katalogu catkin_ws, ustaw zmienne środowiskowe (oraz nazwy globalnie zainstalowanych paczek w /opt/ros/noetic) i wywołaj komendę catkin_make, aby dokonać kompilacji środowiska ROS’owego.

ros-student@rosstudent-PC:~$ cd ~/catkin_ws
ros-student@rosstudent-PC:~/catkin_ws$ source /opt/ros/noetic/setup.bash
ros-student@rosstudent-PC:~/catkin_ws$ catkin_make

Otwierając terminal mamy możliwość komunikacji z urządzeniami wyjścia (np. wyświetlenie tekstu na ekranie) poprzez komendy powłoki systemu. Każde nowe okno terminala (Ctrl+Shift+`) posiada domyślną konfigurację shella. Środowisko ROS’a posiada zmienne (ang. ROS Environment Variables), które domyślnie nie są znane shellowi. Przykładem takich zmiennych są ROS_ROOT, ROS_MASTER_URI, and PYTHONPATH. Nadpisywanie tych zmiennych w obecnym oknie terminala będziemy nazywali “source’owaniem”. Każde otwarte okno terminala, w którym planujemy pracować z ROS’em będzie wymagało tej operacji.

ros-student@rosstudent-PC:~$ cd ~/catkin_ws
ros-student@rosstudent-PC:~/catkin_ws$ source devel/setup.bash

Komenda source powoduje wywołanie skryptu w obrębie obecnej powłoki systemu. devel/setup.bash to lokalizacja skryptu, który ustawia ROS’owe zmienne środowiskowe oraz nazwy lokalnie zainstalowanych paczek (w catkin_ws/src). Skrypt ten jest tworzony automatycznie w trakcie kompilacji.

Wyświetl jedną ze zmiennych środowiskowych (nie musisz być w katalogu catkin_ws):

ros-student@rosstudent-PC:~/catkin_ws$ echo $ROS_PACKAGE_PATH

Możesz zdecydować się na nadpisanie domyślnej konfiguracji shella (zawartą w ukrytym pliku .bashrc), przez co nie będziesz musiał pamiętać o source’owaniu, lecz nie jest to zalecane dla początkujących użytkowników. Aby zmienić ustawienie shella globalnie (i móc bez source’owania korzystać z paczek zainstalowanych globalnie dla ROS’a) możesz zastosować poniższą komendę:

ros-student@rosstudent-PC:~$ echo "NIE ZALECANE POCZATKUJACYM UZYTKOWNIKOM"
ros-student@rosstudent-PC:~$ echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc

Lub aby pominąć source’owanie lokalnego workspace:

ros-student@rosstudent-PC:~$ echo "BARDZO NIE ZALECANE POCZATKUJACYM UZYTKOWNIKOM"
ros-student@rosstudent-PC:~$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

Powyższa komenda będzie prawidłowo konfigurować Twój workspace catkin_ws do czasu usunięcia katalogu devel lub zmiany środowiska (gdy zamiast catkin_ws utworzysz inny ROS’owy folder i będziesz chciał pracować w nowym).

Zastosowanie > na istniejącym pliku powoduje nadpisanie jego całej zawartości, natomiast podwójny operator >> dodaje wiersz na końcu pliku.

Zalecane jest ręczne używanie poleceń source devel/setup.bash, gdy foldery setup i devel istnieją, a w przeciwnym wypadku source /opt/ros/noetic/setup.bash (zazwyczaj przed pierwszym zbudowaniem).

Zadanie 3.
Utwórz nowe okno terminala (Ctrl+Shift+`) bez “source’owania” i wyświetl zmienną środowiskową $ROS_PACKAGE_PATH. Jaki będzie efekt? Dokonaj “source’owania” i zaobserwuj zmianę.

Zadanie 4.
Uruchom symulację robota Fanuc LR Mate 200iD\7l.

users

Zastosuj plik uruchomieniowy (launch) o nazwie demo.launch z paczki fanuc_lrmate200id7l_moveit_config. Wywołaj go komendą:

ros-student@rosstudent-PC:~$ roslaunch nazwa_paczki nazwa_launcha

Przejrzyj plik demo.launch i podaj nazwy węzłów (ang nodes), które są uruchamiane (pomiń węzły includowane z innych plików launch). Komenda Roslaunch tworzy automatycznie ROS Master'a, jeśli nie został uruchomiony. Zapoznaj się z robotem, wykorzystaj panel do sterowania przegubami.

Zadanie 5.
a)   W nowym terminalu (nie wyłączaj symulacji) uruchom program rqt. Otwórz zakładkę Plugins --> Introspection --> Node Graph i sprawdź jakie węzły (nodes) i tematy (topics) są aktywne oraz jakie są między nimi połaczenia.
b)   Sprawdź listę tematów w terminalu komendą rostopic list
c)   Sprawdź listę tematów w rqt za pomocą zakładki Plugins --> Topics --> Topic Monitor. Odczytaj wiadomości z wybranego tematu.

Zadanie 6.
Pobierz i uruchom przykładowy projekt Turtle Snake. Instrukcja znajduje się wewnątrz repozytorium.


Zadanie domowe

Jeśli nie udało Ci się wykonać wszystkich zadań podczas laboratorium, dokończ je w domu. Umiejętności z tych zajęć są konieczne podczas kolejnego laboratorium. Dla osób chętnych pogłębienia wiedzy i zrozumienia materiału warte uwagi są tutoriale opisujące działanie ROS’a i Linux’a:

🐢 Podstawowe pojęcia

🐢 Tworzenie środowiska, tworzenie paczki, budowanie środowiska

🐢 Struktura środowiska - katalogi source, devel, build

🐢 Wczytywanie środowiska - source’owanie

🐢 Uruchamianie wielu węzłów na raz - roslaunch

🐢 Zbiór poradników do korzystania z ROS’a

🐢 Zbiór poradników do korzystania z Linux’a